home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / asxsrc.arc / M04MCH.C < prev    next >
C/C++ Source or Header  |  1989-08-25  |  3KB  |  203 lines

  1. /* m04mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "6804.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1, t2, type;
  25.     struct expr e1, e2, e3;
  26.     int v1, v2;
  27.  
  28.     op = mp->m_valu;
  29.     type = mp->m_type;
  30.     switch (type) {
  31.  
  32.     case S_INH:
  33.         outab(op);
  34.         break;
  35.  
  36.     case S_BRA:
  37.         expr(&e1, 0);
  38.         v1 = e1.e_addr - dot->s_addr - 1;
  39.         if ((v1 < -16) || (v1 > 15))
  40.             aerr();
  41.         if (e1.e_base.e_ap != dot->s_area)
  42.             rerr();
  43.         outab(op | v1&0x1F);
  44.         break;
  45.  
  46.     case S_TYP1:
  47.         expr(&e1, 0);
  48.         e1.e_addr += op;
  49.         outrw(&e1, 0);
  50.         break;
  51.  
  52.     case S_TYP2:
  53.     case S_TYP3:
  54.         t1 = addr(&e1);
  55.         if (type == S_TYP3 & t1 == S_IMMED) {
  56.             outab(op|0x08);
  57.             outrb(&e1, 0);
  58.             break;
  59.         }
  60.         if (t1 == S_DIR) {
  61.             v1 = e1.e_addr;
  62.             if (!e1.e_base.e_ap &
  63.                 v1 >= 0x80 & v1 <= 0x83) {
  64.                 v1 &= 0x03;
  65.                 if (op == 0xE0) {
  66.                     outab(0xAC | v1);
  67.                     break;
  68.                 }
  69.                 if (op == 0xE1) {
  70.                     outab(0xBC | v1);
  71.                     break;
  72.                 }
  73.                 if (op == 0xE6) {
  74.                     outab(0xA8 | v1);
  75.                     break;
  76.                 }
  77.                 if (op == 0xE7) {
  78.                     outab(0xB8 | v1);
  79.                     break;
  80.                 }
  81.             }
  82.             outab(op|0x18);
  83.             outrb(&e1, 0);
  84.             break;
  85.         }
  86.         if (t1 == S_IX) {
  87.             outab(op);
  88.             break;
  89.         }
  90.         if (t1 == S_IY) {
  91.             outab(op|0x10);
  92.             break;
  93.         }
  94.         aerr();
  95.         break;
  96.  
  97.     case S_CLR:
  98.         outab(0xB0);
  99.         outab(op);
  100.         outab(0x00);
  101.         break;
  102.  
  103.     case S_LD:
  104.         t1 = addr(&e1);
  105.         if (t1 == S_IMMED) {
  106.             outab(0xB0);
  107.             outab(op);
  108.             outrb(&e1, 0);
  109.             break;
  110.         }
  111.         aerr();
  112.         break;
  113.  
  114.     case S_MVI:
  115.         t1 = addr(&e1);
  116.         if (t1 != S_DIR)
  117.             aerr();
  118.         comma();
  119.         t2 = addr(&e2);
  120.         if (t2 != S_IMMED)
  121.             aerr();
  122.         outab(op);
  123.         outrb(&e1, 0);
  124.         outrb(&e2, 0);
  125.         break;
  126.  
  127.     case S_APOST:
  128.         outab(op);
  129.         outab(0xFF);
  130.         break;
  131.  
  132.     case S_BPM:
  133.     case S_BXPM:
  134.     case S_BYPM:
  135.         if (type == S_BPM)
  136.             v1 = 0xFF;
  137.         if (type == S_BXPM)
  138.             v1 = 0x80;
  139.         if (type == S_BYPM)
  140.             v1 = 0x81;
  141.         expr(&e2, 0);
  142.         v2 = e2.e_addr - dot->s_addr - 3;
  143.         if ((v2 < -128) || (v2 > 127))
  144.             aerr();
  145.         if (e2.e_base.e_ap != dot->s_area)
  146.             rerr();
  147.         outab(op);
  148.         outab(v1);
  149.         outab(v2);
  150.         break;
  151.  
  152.     case S_BTB:
  153.     case S_BSC:
  154.         t1 = addr(&e1);
  155.         if (t1 != S_IMMED)
  156.             aerr();
  157.         if (e1.e_addr & ~0x07)
  158.             aerr();
  159.         e1.e_addr += op;
  160.         comma();
  161.         t2 = addr(&e2);
  162.         if (t2 != S_DIR)
  163.             aerr();
  164.         if (type == S_BTB) {
  165.             comma();
  166.             expr(&e3, 0);
  167.             v1 = e3.e_addr - dot->s_addr - 3;
  168.             if ((v1 < -128) || (v1 > 127))
  169.                 aerr();
  170.             if (e3.e_base.e_ap != dot->s_area)
  171.                 rerr();
  172.         }
  173.         outrb(&e1, 0);
  174.         outrb(&e2, 0);
  175.         if (type == S_BTB)
  176.             outab(v1);
  177.         break;
  178.  
  179.     default:
  180.         err('o');
  181.     }
  182. }
  183.  
  184.  
  185. /*
  186.  * The next character must be a
  187.  * comma.
  188.  */
  189. VOID
  190. comma()
  191. {
  192.     if (getnb() != ',')
  193.         qerr();
  194. }
  195.  
  196. /*
  197.  * Machine specific initialization.
  198.  */
  199. VOID
  200. minit()
  201. {
  202. }
  203.